package com.cs1.vue.b设计包.SQL设计.SQLjson设计;


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Service;


import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

/**
 * 我们希望所有SQLjson都继承此抽象类
 * 由于是 专门给 SQL 设计的,所以 成员变量的变量名 称为 列名
 */
@Service
public abstract class SQLjson  {
	
	private String jsonString=null;// 序列化 的字符串
	
	/**
	 * @return 注意这个返回的并不一定是 全新的 序列化 ,可以通过 toString() 刷新
	 */
	final public String GetJsonString() {
		if(this.jsonString==null) {
			this.jsonString= JSON.toJSONString(this);
		}
		return this.jsonString;
	}
	
	/**
	 * 需要注意的是 反序列化 出来的对象 是全新的对象,并不存在引用 <br/>
	 * 也就是 原型模式
	 */
	final public <T extends SQLjson> T 反序列化(){
		return (T) JSONObject.parseObject(JSON.toJSONString(this),this.getClass());
	}
	
	/**
	 * 这个会刷新 jsonString 的序列化<br/>
	 * 你可以把它当作钩子函数,放在子类的set方法里,保证需要更新的数据一定是新的<br/>
	 * 当然它并没有保证线程安全<br/>
	 */
	@Override
	final public String toString() {
		this.jsonString= JSON.toJSONString(this);
		return this.jsonString;
	}
	
	final public List<String> Get列名s(){
		List<String> s=new ArrayList<>();
		for (Field v : this.getClass().getDeclaredFields())
			s.add(v.getName());
		return s;
	}
	
	final public Object Get列名value(String 列名){
		try {
			for(Field v :this.getClass().getDeclaredFields())
				if(v.getName().equals(列名)){
					v.setAccessible(true);
					return v.get(this);
				}
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public abstract String GetTableName();//获取表名 需要
}
